package aspectos;
import java.util.HashMap;
import java.util.Map;


import dominio.*;
import adicionales.ValorInvalidoExeception;

public aspect ValidadorAspect {

	
	private Map<Object,Map<String,Validador<String>>>map = new HashMap<Object,Map<String,Validador<String>>>();
	
	pointcut fieldCatcher(Object target, Object newValue):
		set(* dominio..*)
		&& args(newValue) 
		&& target(target);
	
	before(Object target, Object newValue) throws ValorInvalidoExeception: fieldCatcher(target,newValue){
		
		String fieldName = thisJoinPoint.getSignature().getName();
		String fieldValue = thisJoinPoint.getArgs()[0].toString();	
		Map<String,Validador<String>> tempMapValidadores = map.get(target);
		
		if(tempMapValidadores!= null && !tempMapValidadores.get(fieldName).validar(fieldValue)){
			throw new ValorInvalidoExeception("Nombre Invalido");			
		}
	}
	
	
	public void agregarValidador(Object p1, String st, Validador<String> validador){
		agregarAlmap(p1,st,validador);
	}
	
	private void agregarAlmap(Object p1, String st, Validador<String> validador) {
		if(this.map.containsKey(p1)){
			Map<String,Validador<String>> m = this.map.get(p1);
			m.put(st,validador);
		}else{
			Map<String,Validador<String>> m = new HashMap<String, Validador<String>>();
			m.put(st, validador);
			this.map.put(p1, m);
		}
		
	}
	

}
